home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / lists / mint / l_1599 / 1357 < prev    next >
Encoding:
Internet Message Format  |  1994-08-27  |  2.4 KB

  1. Subject: Sticky text
  2. Date: Thu, 05 May 1994 18:23:15 -0700
  3. From: Howard Chu <howard@harry.lloyd.com>
  4.  
  5. This is what I originally wanted for shared-text programs under MiNT, but kept
  6. forgetting to take that last step. With this patch, shared-text memory regions
  7. stay in memory even after the last process using the region exits. That way
  8. the region can be used again if the same program is rerun in the future, saving
  9. load time. Unattached shared-text regions are reclaimed in get_region when
  10. memory is running low, so the overall impact shouldn't cause you to run out
  11. of memory any more often than before.
  12.  
  13. This patch goes a long way toward making my pre-loaded RAMdisk /bin obsolete.
  14. GCC compiles go a lot faster too, but then, I've got spare RAM to throw at it.
  15.   -- Howard
  16.  
  17. --- 1.2    1994/03/02 08:06:50
  18. +++ mem.c    1994/04/27 02:18:44
  19. @@ -577,5 +577,5 @@
  20.      int mode;
  21.  {
  22. -    MEMREGION *m, *n;
  23. +    MEMREGION *m, *n, *s;
  24.  
  25.      TRACELOW(("get_region(%s,%lx,%x)",
  26. @@ -591,7 +591,6 @@
  27.      size = ROUND(size);
  28.  
  29. -    n = *map;
  30. -
  31.      sanity_check(map);
  32. +
  33.  /* exact matches are likely to be rare, so we pre-allocate a new
  34.   * region here; this helps us to avoid re-entrancy problems
  35. @@ -600,4 +599,11 @@
  36.      m = new_region();
  37.  
  38. +/* We come back and try again if we found and freed any unattached shared
  39. + * text regions.
  40. + */
  41. +retry:
  42. +    s = NULL;
  43. +
  44. +    n = *map;
  45.      while (n) {
  46.          if (ISFREE(n)) {
  47. @@ -623,8 +629,21 @@
  48.                  }
  49.              }
  50. +/* If this is an unattached shared text region, leave it as a last resort */
  51. +        } else if (n->links == 0xffff && (n->mflags & M_SHTEXT)) {
  52. +            if (!s)
  53. +                s = n;
  54.          }
  55.          n = n->next;
  56.      }
  57.  
  58. +/* Looks like we're out of free memory. Try freeing an unattached shared text
  59. + * region, and then try again to fill this request.
  60. + */
  61. +    if (s) {
  62. +        s->links = 0;
  63. +        free_region(s);
  64. +        goto retry;
  65. +    }
  66. +        
  67.      if (m)
  68.          dispose_region(m);
  69. @@ -1295,4 +1314,8 @@
  70.          {
  71.              m = s->text;
  72. +/* Kludge for unattached shared region */
  73. +            if (m->links == 0xffff)
  74. +                m->links = 0;
  75. +
  76.              if (attach_region(curproc, m)) {
  77.  TRACE(("re-using shared text region %lx", m));
  78. --- 1.3    1994/05/05 18:04:18
  79. +++ dosmem.c    1994/04/27 02:13:44
  80. @@ -832,6 +832,12 @@
  81.                  }
  82.                  m->links--;
  83. +/* Leave shared text regions in memory, get_region will reclaim them if
  84. +   memory runs low. Assume that we will never have 65535 processes
  85. +   using a particular memory region. */
  86.                  if (m->links == 0) {
  87. -                    free_region(m);
  88. +                    if (m->mflags & M_SHTEXT)
  89. +                        m->links = 0xffff;
  90. +                    else
  91. +                        free_region(m);
  92.                  }
  93.              }
  94.